<html>
    <head>
        <title>集成服务  Interation Services</title>
    </head>
    <body>
        <script>
            //  集成服务   Intergration Services  

                    /*
                            创建"集成服务"这个概念，是为了区分"依赖模块中的应用程序服务" 和 "旨在UI或客户端应用程序使用的应用程序服务"。
                        
                            下图显示了由UI应用程序和第3方客户端应用程序使用的API网关背后的一些微服务：

                            来自API Gateway的HTTP请求可以被称为外部请求，
                            
                            而微服务之间执行的HTTP请求可以被认为是内部请求。

                            旨在响应这些"内部请求" 的应用服务被称为"集成服务"，而不是响应用户请求。
                    */

                    /*
                        一、将"应用程序服务"标记为集成服务

                                假设您有一个名为ProductAppService的应用程序服务，并且您想将该应用程序服务用作集成服务。

                                在这种情况下，您可以在应用程序服务类之上使用[IntegrationService]特性，

                                如下所示：

                                        [IntegrationService]
                                        public class ProductAppService : ApplicationService, IProductAppService
                                        {
                                            // ...
                                        }

                                如果你的应用程序服务有一个接口，例如本例中的 IProductService ,你可以在接口上使用 [IntegrationService] 特性，
                                
                                如下所示：
                                        [IntegrationService]
                                        public interface IProductAppService : IApplicationService
                                        {
                                            // ...
                                        }

                                （如果你在接口上使用了 [IntegrationService] 特性,就不需要再在实现类上用了！！）


                                就是这么简单。 

                                从现在开始，ABP把你的应用程序服务作为集成服务处理，并按照管理实现以下内容：

                                    ①、默认情况下，该服务不公开，除非您显式设置ExposeIntegrationServices选项（请参阅公开集成服务部分）。

                                    ②、如果您在应用程序中使用"自动API控制器功能",则URL前缀将是/integration-api，而不是/api。

                                            因此，你可以区分内部和外部服务通信，并采取其他措施，例如阻止对API网关外的集成服务的REST API调用。

                                    ③、集成服务默认禁用审核日志记录。如果要启用它，请参阅下一节。

                    */

                    /*
                        二、将MVC控制器标记为集成服务

                                除了应用程序服务之外，您还可以使用相同的[IntegrationService] 特性将常规MVC控制器标记为集成服务，
                                
                                或者继承具有IntegrationService属性的接口。

                                    eg:  
                                        [IntegrationService]
                                        public class MyController : Controller
                                        {
                                            public ActionResult Index()
                                            {
                                                return View();
                                            }
                                        }


                                当你使用 [IntegrationService]特性时，ABP会将你的控制器作为集成服务处理，并按照约定实现以下内容：

                                        ①、默认情况下，该控制器不会向客户端公开，除非您明确设置ExposeIntegrationServices选项（请参阅公开集成服务部分）。

                                        ②、审核日志默认情况下对控制器禁用。如果要启用它，请参阅下一节。
                    */

                    /*
                        三、配置集成服务


                                 1、 公开集成服务   Exposing Integration Services

                                            出于安全原因，集成服务和控制器默认不公开。
                                            
                                            它们通常不需要授权(因为是微服务之间的请求、甚至说是在进程内的调用)，因此您应该仔细而明确地允许它们对客户端应用程序可见和可用。


                                            要公开集成服务和控制器，请将 "AbpAspNetCoreMvcOptions.ExposeIntegrationServices" 设置为true,
                                            
                                            在模块类的方法中：

                                                        Configure<AbpAspNetCoreMvcOptions>(options =>
                                                        {
                                                            options.ExposeIntegrationServices = true; // 是允许集成服务公开？
                                                        });

                                            备注：  
                                                当您正在构建可重用的应用程序模块时，隐藏集成服务很有用， 它们可能在单体应用程序或微服务系统中使用。

                                                在单体应用程序中，集成服务不需要暴露在外部，因为模块可以在进程内相互通信。

                                                另一方面，如果您构建微服务解决方案并将该模块用作服务，则公开集成服务将是适当的，
                                                
                                                因此其他微服务可以在您的专用网络（或库伯内特斯集群）内远程使用它们。

                                                在这种情况下，请注意不要意外地将集成服务暴露在您的专用网络之外。

                                                配置您的API网关，以便它阻止来自网络外部的integration-api前缀URL的请求将是一个不错的选择。


                                 2、启用/禁用审计日志记录

                                               默认情况下，集成服务禁用审核日志记录，
                                               
                                               但可以通过在模块类的ConfigureServices方法中配置AbpAuditingOptions选项类来启用它： 
                                               
                                                            Configure<AbpAuditingOptions>(options =>
                                                            {
                                                                options.IsEnabledForIntegrationService = true;
                                                            });

                                                        
                                 3、过滤自动API控制器

                                              您可以在创建Auto API Controller时过滤集成服务（或非集成服务），
                                              
                                              通过配置AbpAspNetCoreMvcOptions，使用 ConventionalControllerSetting的ApplicationServiceTypes选项，如下所示：

                                                            PreConfigure<AbpAspNetCoreMvcOptions>(options =>
                                                            {
                                                                options.ConventionalControllers.Create(
                                                                    typeof(MyApplicationModule).Assembly,
                                                                    conventionalControllerSetting =>
                                                                    {
                                                                        conventionalControllerSetting.ApplicationServiceTypes = 
                                                                            ApplicationServiceTypes.IntegrationServices;  // 只创建集成服务控制器

                                                                    });
                                                            });

                                            提示：您可以调用options.ConventionalControllers.Create以使用不同的选项配置常规应用程序服务和集成服务。
                                                            
                    */
        </script>
    </body>
</html>